package Panaderia;

import Tipos.Buffer;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import Tipos.Mensaje;
import Tipos.TipoMensaje;
import Tipos.UbicacionPanaderia;

public class PanaderoEscuchadorTCP extends Thread{
    private ObjectInputStream inStreamCoordinador;
    private UbicacionPanaderia direccionSucursal;
    private Buffer peticionesMostrador;
    private Buffer peticionesProcesador;
    private boolean cerrar;

    public PanaderoEscuchadorTCP(ObjectInputStream inStreamCoordinador, UbicacionPanaderia direccionSucursal, Buffer peticionesMostrador, Buffer peticionesProcesador) {
        this.inStreamCoordinador = inStreamCoordinador;
        this.direccionSucursal = direccionSucursal;
        this.peticionesMostrador = peticionesMostrador;
        this.peticionesProcesador = peticionesProcesador;
        this.cerrar = false;
    }  
    
    void cerrar(boolean cerrar) {
        this.cerrar = cerrar;
    }
    
    /*
     * El panadero que escucha al coordinador encola los mensajes
     * en dos colas distintas: si el emisor del mensaje es la panaderia 
     * corriente entonces los mensajes son colocados en la cola del mostrador, 
     * caso contrario los mensajes son colocados en  la cola del procesador.
     * 
     */
    
    @Override
    public void run() {
        try {
            
            //conexion con servidor TCP
            while(!cerrar){
                Object aux = inStreamCoordinador.readObject();
                if (aux instanceof Mensaje){ // Se comprueba si es de tipo Mensaje
                    Mensaje mensaje = (Mensaje) aux;
                    //System.out.println("mensaje: " + mensaje);                    
                    if (mensaje.getMensajePanaderia() == TipoMensaje.COMENZAR_PANADERIA){
                        direccionSucursal.setIp(mensaje.getParticipanteCommit().getIp());
                        direccionSucursal.setPuerto(mensaje.getParticipanteCommit().getPuerto());
                        direccionSucursal.setNombre(mensaje.getParticipanteCommit().getNombre());
                        direccionSucursal.setId(mensaje.getParticipanteCommit().getId());
                    }
                    if (mensaje.getMensajePanaderia() == TipoMensaje.PANADERIA_CERRADA){
                         peticionesProcesador.put(mensaje);
                         break;
                    }
                        //direccionSucursal = mensaje.getParticipanteCommit();
                    //System.out.println("PanaderoEscuchadorTCP--------------------> direccion Sucursal: " + direccionSucursal);
                    if (direccionSucursal.equals(mensaje.getIniciador())){//si el emisor soy yo
                        peticionesMostrador.put(mensaje);
                        //System.out.println("PanaderoEscuchadorTCP ----> recibe dato (peticionesMostrador): \n" + dato.toString()+"\n");
                    }
                    else{
                        peticionesProcesador.put(mensaje);
                        //System.out.println("Thread PanaderoEscuchadorTCP----> recibe dato (peticionesProcesador): \n" + dato.toString()+"\n");
                    }
                    //System.out.println("Thread PanaderoEscuchadorTCP----> recibe dato: \n" + dato.toString()+"\n");
                }
            }
            inStreamCoordinador.close();


        } catch (UnknownHostException ex) {
            String error = "No conoce el host, cerrar = " + cerrar;
            Logger.getLogger(Panaderia.class.getName()).log(Level.SEVERE, error, ex);
        } catch (IOException | ClassNotFoundException ex) {
            String error = "No encuentra la clase, o error de entrada/salida, cerrar = " + cerrar;
            Logger.getLogger(Panaderia.class.getName()).log(Level.SEVERE, error, ex);
        }
    }
  
}
